package com.zip;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

import org.apache.commons.lang3.ArrayUtils;

public class Test1 {
	
	//源目标文件
	public static String path = "D:/codeszip/红星镇.zip";
	
	//压缩第一遍目标文件
	public static String unZipPath = "D:/codesunzip";
	
	
	//后台文件地址
	public static String adminPath = "D:/codeszip/红星镇.zip";
	
	//后台文件地址
	public static String contrastPath = "D:/contrastPath";
	

	public void dd(){
//		FileToZip.fileToZip("C:/Users/domains90/Desktop/tt/bb","C:/Users/domains90/Desktop","aa");
		FileToZip.fileToZip("C:/Users/domains90/Desktop/tt/bb","C:/Users/domains90/Desktop","aa.zip");
		File file = new File("");

		try {
			Files.readAllBytes(file.toPath());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws IOException {
		Test1 test = new Test1();
		test.dd();
		
	}
	
	/**
	 * 最多只支持 两次.zip
	 * */
	public void aa() throws IOException {
		
		File zip = new File(path);
		if(!zip.exists()) {
			throw new RuntimeException("不存在目标的文件");
		}
		
		File adminZip = new File(adminPath);
		if(!adminZip.exists()) {
			throw new RuntimeException("不存在系统的文件");
		}
		
		//解压
		File baseFile = new File(unZipPath);
		System.out.println("删除目录:"+unZipPath);
		//清除该文件夹
		FileToZip.deleteAllFilesOfDir(baseFile);
		//创建该文件夹
		baseFile.mkdirs();
		
		
		//解压
		File childUnZipFile = new File(unZipPath+"/child");
		System.out.println("删除目录:"+childUnZipFile.getPath());
		//清除该文件夹
		FileToZip.deleteAllFilesOfDir(childUnZipFile);
		//创建该文件夹
		childUnZipFile.mkdirs();
		
		//解压
		File unzipadminFile = new File(unZipPath+"/admin");
		System.out.println("删除目录:"+unzipadminFile.getPath());
		//清除该文件夹
		FileToZip.deleteAllFilesOfDir(unzipadminFile);
		//创建该文件夹
		unzipadminFile.mkdirs();
		
		
		//目标文件解压
		unZipAll(zip,childUnZipFile);
		
		//系统文件解压
		unZipAll(adminZip,unzipadminFile);
		
		//遍历源目标文件
		//排除第一次解压的原目录
		File[] files = childUnZipFile.listFiles();
		for(File sourcetarget:files) {
			if(!sourcetarget.getName().equals(this.getFilename(zip))) {
				System.out.println("读取目录："+sourcetarget.getName());
				if(sourcetarget.isDirectory()) {
					//比较文件
					this.contrast(sourcetarget,unzipadminFile.getPath());
				}
			}
		}
	}
	
	/**
	 * 文件对比
	 * */
	public void contrast(File sourceTargetFile,String adminPath) {
		
		if(sourceTargetFile.isDirectory()) {	
			File adminFile = new File(adminPath+"/"+sourceTargetFile.getName());
			if(adminFile.exists()&&adminFile.isDirectory()) {
				//系统的文件
				File[] adminFiles = adminFile.listFiles();
				
				//目标目录文件
				//File[] sourceFile = sourceTargetFile.listFiles();
				String[] names = sourceTargetFile.list();
				for(File file:adminFiles) {
					if(!ArrayUtils.contains(names, file.getName())) {
						System.out.println("不存在的文件："+file.getName());
					}else {
						System.err.println("存在的文件："+file.getName());
					}
				}
			}else {
				System.out.println("不存在目录："+adminPath+"/"+sourceTargetFile.getName());
			}
		}
	}
	
	/**
	 * 获取目录 或者文件名称；
	 * */
	private String getFilename(File file) {
		if(file.isDirectory()) {
			return file.getName();
		}else if(file.isFile()){
			String name = file.getName();
			int length = name.lastIndexOf(".");
			name = name.substring(0,length);		
			return name;
		}else {
			throw new RuntimeException("暂只支持 目录与文件");
		}
	}
	
	/**
	 * 获取文件后缀
	 * */
	private String getSuffixName(File file) {
		if(file.isFile()) {
			String name = file.getName();
			int length = name.lastIndexOf(".");
			name = name.substring(length);		
			return name;
		}else {
			throw new RuntimeException("暂只支持文件");
		}
	}
	
	
	/**
	 * 递归解压 到同一目录
	 * */
	public void unZipAll(File file,File targetFile) {
		if(file.isDirectory()) {
			File[] files = file.listFiles();
			for(File nut:files) {
				unZipAll(nut,targetFile);
			}
		}else if(file.isFile()){
			String name = file.getName();
			if(name.contains(FileToZip.suffixName)) {			
				if(FileToZip.suffixName.equals(this.getSuffixName(file))) {
					//解压缩
					File childFile = unzip(file,targetFile.getPath());
					System.out.println(childFile.getPath());
					unZipAll(childFile,targetFile);
				}
			}
		}
	}
	

	/**
	 * @param file 需要解压的zip文件
	 * @param basePath 目标的基础目录
	 * */
	public File unzip(File file,String basePath) {
		
		String filename = file.getName();
		if(!file.isFile()&&!filename.contains(".zip")) {
			throw new RuntimeException("非.zip文件文件");
		}
		if(this.getSuffixName(file).equals(FileToZip.suffixName)) {
			UnZipUtil.unzip(file.getPath(), basePath);
		}else {
			throw new RuntimeException("文件类型错误 need .zip");
		}		
		return new File(basePath+"/"+this.getFilename(file));		
	}

}


